#include "Chapter3.h"
#include <iostream>
#include <vector>
#include "Sales_item.h"

// 命名空间声明
// using 命名空间::空间下有命名的字段，没有的字段不行
// 所有要单独用的都在using 里声明，真tm麻烦
using std::cin;
using std::string;
using std::vector;

// string 字符串的操作
void Chapter3::SetStr()
{
	// string 类型居然还要依赖命名空间才行
	string s1;
	s1 = "lalal";

	string s2 = s1;

	string s3(5,'x');  //相当于  s3 = xxxxx  
}


//标准库类型 vector
void Chapter3::SetVector()
{
	// vector 用来表示对象的集合  可以用来存储数据和对象，所以是一个容器
	// 类似 list 
	vector<int> ivec;
	vector<Sales_item> sales_vec;
	vector<vector<string>> file;

	// 元素初始化 / 列表的初始化
	vector<int> v1(10);    //v1有10个元素，每个的值都是0 = 列表初始化
	vector<int> v1_1(10,1);   // 10 个 1 

	vector<int> v2{ 10 };  // v2有1个元素，元素的值是10 ；

	// 增 删 改 
	vector<int> v3;

	// 增 push_back
	for (int i = 0; i < 10; i++)
	{
		v3.push_back(i);             
	}
	int count = v3.size();   // 集合的长度 或者说是元素的数量

	int allNum = 0;
	for (auto &i :v3)  // &i 实际指向 v3内的每一个元素  i 这里是一个引用，指向元素
	{
		allNum += i;   
	}

	vector<unsigned> score(11, 0);
	unsigned grade;  //数据不定精度  但是其实范畴是 int float double char 等
	while (cin >> grade)
	{
		if (grade <= 100)
		{
			++score[grade/10];   // 取下标值累加
		}
	}

}

/*
3.4 迭代器
*/
void Chapter3::SetIter()
{
	string v = "dasrew";
	auto b = v.begin(), e = v.end();

	// begin end 表示获取对应迭代器的 第一个元素 以及 “尾元素的下一位置” 道理就是最后一个吧

	if (v.begin() != v.end())
	{
		auto it = v.begin();
		*it = toupper(*it);
	}

	// 迭代器的运算操作
	// *it 指向引用的元素
	// it -> men  引用it，并获取该元素名为men 的成员，等价于(*it).men ,类似获对象中对应字段的数据
	// ++it --it 指向容器的下一个、上一个元素
	// ==  != 条件判断

	// isspace 判断获取的元素是否为空格
	for (auto it = v.begin(); it != v.end() && !isspace(*it); ++it)
	{
		*it = toupper(*it);
		// (*it).empty();   检测对象是否为空
	}

	// 这里it 相当于取第几个，和普通的for 循环类似。 这里遍历 v 字符，直到最后一个字符或者遇到空格 
	// ++it ，递增，取下一个位元素
	string::iterator it2;            // 可读写
	string::const_iterator it3;     //  只能读  ，对应 const 为常量的定义，所以是不能修改

}

/*
3.5 数组
*/
void Chapter3::SetArry()
{
	int arr[10];
	int *parr[10];    // 整型指针数组
	int a1[5] = {52,12,3};  //  等价于  {52,12,3,0,0}

	// 数组间不能直接拷贝和赋值 ，尽量避免这样的操作

	unsigned scores[11] = {};
	for (auto i:scores)    // 变量获取数组每一个数据
	{
		std::cout << i << " ";
	}
	std::cout << std::endl;

	// 指针和数组
	string nums[] = { "one","tow","three" };
	string *p = &nums[0];    // p 这个指针，指向了 数组 nums的第一位

	string *p2 = nums;  // 等价于 p2 = &nums[0]  ，默认会认为取的是第一个

	// 指针也是迭代器
	int arr2[] = {0,1,2,3,4,5};
	int *pp = arr2;   // p 指向 arr 第一个元素
	++pp;			// p 指向 arr[1]  ，++ 在arr上取下一位

	int *ip2 = pp + 2;  //  在 pp 的基础上取后两位数组数值，指向这个元素

}

/*
3.6 多维数组
*/
void Chapter3::SetMutilArry()
{
	// 严格来说，c++没有多维数组，通常指的是数组的数组

	constexpr size_t rowCnt = 3, colCnt = 4;
	// 赋值
	int id[rowCnt][colCnt];
	for (size_t i = 0; i != rowCnt; i++)
	{
		for (size_t j = 0; j != colCnt ; j++)
		{
			id[i][j] = i * colCnt + j;
		}
	}

	size_t cnt = 0;
	for (auto &row :id)
	{
		for (auto &col : row)
		{
			col = cnt;
			++cnt;
		}
	}

}